#!/bin/bash

# 获取当前时间戳来作为测试的唯一标识
RUN_TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
LOG_DIR=./stress_logs/run_$RUN_TIMESTAMP
mkdir -p $LOG_DIR


echo "===== [$(date '+%F %T')]开始综合系统压力测试: $RUN_TIMESTAMP ====="

# 设置测试参数（根据你硬件调整）
MEMTEST_MB=2048           # memtester 使用的内存
MEMTEST_LOOP=42           # memtester 测试轮数
STRESSAPP_MB=2048         # stressapptest 使用的内存
STRESSAPP_SEC=36000       # stressapptest 运行时间（秒）
STRESSAPP_MEM_THREADS=6   # 内存读写线程
STRESSAPP_CPU_THREADS=4   # CPU 压力线程
DD_COUNT=1024             # 每线程写入块数（约1G）
DD_THREADS=4              # 模拟并发 eMMC 写线程数i
DD_READ_THREADS=4         # 模拟读线程
DD_PATH="/mnt/emmc_test"  # eMMC 测试路径

mkdir -p $DD_PATH


# 常用日志函数定义
log_start() {
	echo "==== $1 started at $(date '+%F %T') ===" > "$2"
}

run_memtester() {
	log_start "memtester" "$LOG_DIR/memtester_$RUN_TIMESTAMP.log"
	memtester $MEMTEST_MB $MEMTEST_LOOP 2>&1 | tee -a $LOG_DIR/memtester_$RUN_TIMESTAMP.log &
	MEMTEST_PID=$!
}

run_stressapptest() {
	log_start "stressapptest" "$LOG_DIR/stressapptest_$RUN_TIMESTAMP.log"
	stressapptest -M $STRESSAPP_MB -s $STRESSAPP_SEC -m $STRESSAPP_MEM_THREADS -C $STRESSAPP_CPU_THREADS -v 20 >> $LOG_DIR/stressapptest_$RUN_TIMESTAMP.log 2>&1 &
	STRESS_PID=$!
}
# 启动 memtesteri
echo " 启动 memtester（$(echo "scale=2; $MEMTEST_MB/1024" | bc) GB x 5轮，预估可覆盖120min）"
run_memtester

# 启动 stressapptest
echo " 启动 stressapptest（$(echo "scale=2; $STRESSAPP_MB/1024" | bc) GB, $STRESSAPP_SEC 秒）"
run_stressapptest

# 启动 eMMC 写入压力线程
echo " 启动 eMMC 并行读写压力（$DD_THREADS 个写线程 + $DD_READ_THREADS 个读线程，持续$STRESSAPP_SEC 秒）"
log_start "eMMC" "$LOG_DIR/eMMC_$RUN_TIMESTAMP.log"
(
	START_TIME=$(date +%s)
	while [ $(($(date +%s) - $START_TIME)) -lt $STRESSAPP_SEC ]; do
		# 同时进行，不过是先写后读
		for i in $(seq 1 $DD_THREADS); do
    			(
        			dd if=/dev/zero of=$DD_PATH/emmc_write_test_$i bs=1M count=$DD_COUNT # oflag=direct
        			dd if=$DD_PATH/emmc_write_test_$i of=/dev/null bs=1M count=$DD_COUNT # iflag=direct
    			) &
		done
		wait
		sync
		rm -rf $DD_PATH/emmc_write_test_*
	done
	echo "eMMC 读写任务完成 $(date)"
) >> $LOG_DIR/eMMC_$RUN_TIMESTAMP.log 2>&1 &
EMMC_PID=$!

# 等待所有任务完成
echo "正在运行测试中，请耐心等待..."

wait $STRESS_PID
if [ $? -ne 0 ]; then
	echo "stressapptest task exits abnormally!"
else
	echo "stressapptest task completed at $(date)"
fi
wait $EMMC_PID
if [ $? -ne 0 ]; then
	echo "eMMC task exits abnormally!"
else
	echo "eMMC task completed at $(date)"
fi
wait $MEMTEST_PID
if [ $? -ne 0 ]; then
	echo "memtester task exits abnormally!"
else
	echo "memtester task completed at $(date)"
fi

echo "所有测试完成，结果日志已保存在 $LOG_DIR"

